//===== 函数声明方式
//1.表达式
// let foo1 = function () {
//     console.log('foo1');
// }

// //2.字面量函数
// foo2()
// function foo2() {
//     console.log('foo2');
// }

// 字面量好函数有函数提升，代码运行时会被提升到最前面运行


//3.构造函数
// 通过最顶层的Function创建函数
// let foo3=new Function('参数','参数','函数体');
// let foo3 = new Function('a', 'b', 'console.log(a+b);')
// foo3(10, 20)

//===== 函数的参数
function fn(a, b, ...rest) {
    // console.log(arguments);
    // console.log(arguments[0]);
    // console.log([...arguments]);
    console.log(rest);//剩余参数
}
fn(1, 2, 3)

//==== 函数属性和方法
function fn2(a, b) {
    console.log('fn2');
}
fn2();

console.log(fn2.name);//函数名
console.log(fn2.length);//形参的个数
console.log(fn2.caller);//null 全局调用，没有具体的调用者

function test1() {
    test2()
}
function test2() {
    console.log('test2');
    console.log(test2.caller);//[Function: test1]
}
test1()

// let i = 1;
// function fn3() {
//     // i++;
//     // if (i > 10) {
//     //     return
//     // }
//     arguments.callee()

// }
// fn3()


// 1 + 2 + 3 +...+10;

// function getSum() {
//     let sum = 0;
//     for (let i = 1; i <= 10; i++) {
//         sum += i;
//     }
//     return sum;
// }

function getSum(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num + getSum(num - 1)
    }
}
//10+9+8+7+....+1
let sum = getSum(10);
console.log(sum);

// 阶乘：10 * 11 * 12 *...* 20
function getMul(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * getMul(num - 1)
    }

}
//10+9+8+....+2+1
// let mul = getMul(20);
// console.log(mul);

//1+1*2+1*2*3+1*2*3*4+1*2*3*4*5

function getResult(num) {
    if (num <= 1) {
        return 1;
    } else {
        // let a = 1;
        // for (let i = 1; i <= num; i++) {
        //     a *= i;
        // }
        let a = getMul(num);
        return getResult(num - 1) + a
    }

}
let result = getResult(5);
console.log(result + '111');


//==== 对象
// let obj={};
let obj=new Object('吐露累');
console.log(obj);
// let str='zhangsan';
// console.log(typeof str);



//函数 属性和方法
//函数是什么？  函数就是对象

// 对象是什么？ 对象是函数